如何训练以及prompt你的GPT助手-二进宫OpenAI创始人Andrej倾情奉献「GPT现状」(AI范儿独家解读PPT版)
▽
题图
不过整个演讲信息量很大,透露了非常多的训练细节和提示技巧,确实可以称得上是an emerging recipe。笔者建议大家可以参考本文,结合视频仔细反复阅读观看。
▩内容组成-Training & Prompting
△
在第一部分中,我想告诉您我们如何训练GPT成为人类智能助手;然后在第二部分中,我们将看看如何有效地将这些助手功能应用于您的应用程序。
笔者注💡:整个演讲内容前后两部分互相承接,就是Training与Prompting-如何训练基于LLM预训练的GPT助手应用以及如何更好的与其做prompt交互。GPT的训练和提示紧密相关,只有了解了类似ChatGPT这样的大语言模型服务是如何训练的,才能更好得理解LLM的工作机制和特点,进行针对性的提示交互,为类似人脑System1的LLMs直觉推理创建一个更强大System2,来完成更复杂的任务。
Part I: How to Train your (Chat)GPT Assistant
首先,让我们来看一下训练这些GPT助手应用的新兴方法,要知道这些方法都非常新,仍在快速发展中。到目前为止,这个方法大致如下。
现在,这是一张内容较多较复杂的幻灯片,我将逐个对每个训练进程进行说明,但大致而言,我们有四个主要阶段:
预训练(Pretraining)
监督微调(Supervised Finetuning)
奖励建模(Reward Modeling)
强化学习(Reinforcement Learning)
这4个训练进程完全按顺序进行。在每个阶段中,我们有一个为该阶段提供学习动力的数据集,同时还有一个算法对应于我们的训练目标,也就是一个训练神经网络的目标函数。然后我们得到一个基础模型,底部还有一些注释这个训练阶段需要的算力、训练时间、对应的业界模型等等。
预训练
第一阶段我们将从预训练阶段开始。这个阶段在图表中是特殊的,图表并没有标注训练计算比例,因为这个阶段,按训练所需时间和计算量来说,基本上涵盖了所有的计算工作的99%。我们在这个阶段处理的是具有数千个GPU的超级计算集群中的整个互联网文本规模对等的数据集,并且可能需要数月的训练时间。
其他三个阶段都算是微调阶段,更多地使用了少量GPU和几个小时或几天的时间。让我们来看看预训练阶段是如何获得一个基础模型的。
数据集(datasets)
首先,我们需要收集大量的数据。
这里是一个来自Meta发布的LLaMA模型的论文数据集示例。
现在,您可以看到进入这些集合的数据集大致情况。我们有CommonCrawl,它是一个网络爬取数据集,C4也是CommonCrawl,还有一些高质量的数据集,例如GitHub,Wikipedia,图书馆档案,证券交易所等。这些数据集混合在一起,然后根据一定的比例进行抽样,形成GPT的训练集。
分词处理(tokennization)
在我们实际上可以在这些数据上进行训练之前,我们需要进行另一个预处理步骤,即分词(tokenization)。
这基本上是将我们从互联网上获取的原始文本翻译成整数序列,因为这是GPT所使用的本地表示方式。现在,这是一种无损的文本和tokens与整数之间的转换,这个阶段有许多算法可供选择。通常情况下,我们可以使用类似字节对编码(byte pair encoding)的方法,它会迭代地合并文本块并将它们分组成标记。
在这里,我展示了一些这些tokens的示例块,然后这是实际上将输入到transformer中的原始整数序列。
笔者注💡:以上这部分,可以参考AI范儿编译整理的GPT-3架构文章相关内容-写在餐巾纸上的 GPT-3 架构
模型参数
这里我展示了两个控制此阶段的混合参数的示例。
关于GPT-4,我们没有发布太多关于它的训练方式等信息,图示使用了GPT-3的数据,GPT-3当然已经有点过时了,大约是三年前的事情。
但LLaMA是Meta最近开源的一个模型。这大致是我们在预训练时所处理的数量级。词汇表的大小通常是几万个tokens,上下文长度通常是2,000、4,000,甚至是10万,这决定了当GPT试图预测序列中的下一个整数时,它所考虑的整数的最大数量。
您可以看到,LLaMA大约有650亿个参数。尽管LLaMA只有650亿个参数,相比于GPT-3的1750亿个参数,但LLaMA是一个更强大的模型,直观地说,这是因为该模型的训练时间更长。在这种情况下,训练了1.4万亿个tokens,而不是GPT-3的3000亿个tokens。
您不应该仅通过模型的参数数量来判断其能力。在表格下面,展示了一些关于指定transformer神经网络的大致超参数的表格,包括头的数量、维度大小、层数等,底部我展示了一些训练超参数。例如,为了训练6500亿个模型,Meta使用了2,000个GPU,大约21天的训练时间和大约几百万美元。这是您在预训练阶段应该了解的大致数量级。
预训练
现在,当我们实际进行预训练时,会发生什么呢?
大致而言,我们将把我们的标记排列成数据批次。我们有这些将输入到transformer中的数组,这些数组是B,即批量大小,它们是独立的示例按行堆叠而成的,大小为B乘以T,其中T是最大上下文长度。
在我的图中,我只有10个上下文长度,因此这可以是2,000、4,000等。这些是非常长的行。我们要做的是将这些文档打包成行,并用这些特殊的文本结束token来分隔它们,基本上告诉transformer新文档从哪里开始。在这里,我有一些文档的示例,然后我将它们展开成这样的输入。
现在,我们要将所有这些数字输入到transformer中。让我只关注一个特定的单元格,但在这个图中的每个单元格都会发生同样的事情。让我们看看绿色的单元格。绿色的单元格将查看它前面的所有tokens,也就是黄色的所有标记,然后将整个上下文输入到transformer神经网络中,transformer将尝试预测序列中的下一个token,本例中为红色的token。
transformer,很遗憾,我没有太多时间详细介绍这个神经网络架构的全部细节,它只是一个大型的神经网络部分,通常具有数百亿个参数。当然,随着我调整这些参数,每个单元格的预测分布也会稍微有所不同。
例如,如果我们的词汇表大小为50,257个标记,那么我们将需要那么多个数字,因为我们需要为下一个token指定一个概率分布。基本上,我们对可能跟随的内容有一个概率。在这个具体的例子中,对于这个具体的单元格,下一个token是513,因此我们可以将其作为监督信号来更新我们的transformer权重。
我们基本上在每个单元格上都应用这个过程,并且不断交换批次,努力使transformer能够在序列中正确预测下一个token。让我更具体地向您展示当您训练这些模型之一时,它是什么样子。
这实际上来自《纽约时报》,他们在莎士比亚作品上训练了一个小型GPT。这是莎士比亚的一小段文本,他们用它来训练他们的GPT。现在,在开始时,初始化时,GPT的权重是完全随机的。输出也是完全随机的。
但随着训练时间的推移,当您训练GPT越来越久时,您会从模型中获得越来越一致和连贯的样本。当然,您从中进行采样的方式是,预测下一个token,从该分布中进行采样,并将其反馈回该过程,您可以采样大的序列。
到最后,您会发现transformer已经学会了词汇、在何处放置空格、在何处放置逗号等等。随着时间的推移,我们的预测越来越一致。这些是在模型预训练时观察到的图表。实际上,我们正在观察训练过程中的损失函数,低损失意味着我们的transformer对序列中下一个正确整数的概率更高。
一旦我们训练完模型后,我们要做什么呢?我们领域内的观察到的第一件事是,这些模型在语言建模的过程中学习到非常强大的通用表示方法,并且可以非常高效地对您可能感兴趣的任何任意下游任务进行微调。
例如,如果您对情感分类感兴趣,以前的做法是收集一堆积极和消极的例子,然后训练一些NLP模型进行分类。但现在的做法是:忽略情感分类,进行大型语言模型预训练,训练一个大型transformer,然后您可能只有很少的示例,但您可以非常高效地为该任务微调您的模型。
实践证明,这在实践中非常有效。原因在于,基本上transformer被迫在语言建模任务中进行大量多任务处理,因为在预测下一个token时,它必须对文本的结构以及其中的各种不同概念有所了解。
那是GPT-1,大约在GPT-2时期,人们注意到实际上比微调更好的方法是通过有效地提示这些模型来操作它们。这些是语言模型,它们希望完成文档,您实际上可以通过排列这些虚假文档来诱使它们执行任务。在这个例子中,我们有一些文本段落,然后我们进行问答,问答,问答。
这被称为Few-shot提示,然后我们提出问题,而当transformer尝试完成文档时,它实际上正在回答我们的问题。这是一种基于提示工程的模型,使其相信它正在模仿一个文档并使其执行任务。这开启了我认为提示优于微调的时代,并且看到这在许多问题上实际上非常有效,即使没有训练任何神经网络,微调等等。
从那时起,我们看到了整个基础模型的进化树,每个人都训练了自己的模型。并不是所有这些模型都可用。例如,GPT-4基础模型从未公开发布。您可能在API上与之互动的GPT-4模型并不是一个基础模型,而是一个助手模型,我们将在稍后介绍如何获取这些模型。
GPT-3基础模型可以通过API使用,名为Davinci,而GPT-2基础模型甚至可以在我们的GitHub代码库中作为权重提供。但目前最好的可用基础模型可能是Meta的LLaMA系列,尽管它没有商业许可证。
现在,要指出的一件事是基础模型还不是助手,它们不想回答您的问题,它们只想完成文档。如果您告诉它们写一首关于面包和奶酪的诗,它会用更多的问题回答问题,它正在完成它认为的一个文档。然而,对于基础模型,您可以以更有可能成功的方式进行提示。
例如,这是一首关于面包和奶酪的诗,那么它将能够正确地自动完成。您甚至可以欺骗基础模型成为助手。您可以通过创建一个特定的Few-shot提示来实现这一点,使其看起来像是人与助手之间有一些文档,并且它们正在交换信息。
然后在底部,您将查询放在末尾,基础模型将自身调整为成为一个有帮助的助手并回答问题,但这不是非常可靠,在实践中效果并不好,尽管可以做到。相反,我们有一条不同的路径,可以使真正的GPT助手而不是基础模型的文档补全者。
这将引导我们进入监督微调阶段。
监督微调
在监督微调阶段,我们将收集小而高质量的数据集,在这种情况下,我们将要求人工标注承包商收集形式为提示和理想回答的数据集。我们通常会收集大量这样的数据,可能有数万个左右。
然后,我们将仍然在这些数据上进行语言建模。在算法上没有改变,我们只是更换了训练集。之前是互联网文档,这是大量、质量较低的数据,而现在是问题-回答的数据,这是数量较少、质量较高的数据。我们仍然会进行语言建模,然后在训练之后,我们得到一个经过监督微调(SFT)的模型。
您实际上可以部署这些模型,它们是真正的助手,并且在某种程度上可以工作。让我给您展示一个示例演示可能是什么样子。这是人工标注承包商可能会提出的一些东西。这是一些随机提示。您能写一个关于垄断交易的术语的相关性的简短介绍吗?然后承包商还会编写一个理想回答。
当他们撰写这些回答时,他们遵循详细的标注说明,并被要求提供帮助、真实和无害的回答。这里的标注说明,您可能无法阅读,我也看不懂,但它们很长,这些人按照说明书行事,并尝试完成这些提示。这就是数据集的样子。您可以训练这些模型。在某种程度上,这是有效的。
现在,您实际上可以从这里继续进行流程,并进行强化学习从人类反馈中学习(RLHF),包括奖励建模和强化学习。让我解释一下这个过程,然后我将回到为什么您可能希望经过额外步骤以及与SFT模型的比较。
在奖励建模阶段,我们现在将数据收集方式转变为对比的形式。这是我们数据集的一个示例。我在顶部有完全相同的提示,要求助手编写一个检查给定字符串是否是回文的程序或函数。
然后,我们采用我们已经训练过的SFT模型,并创建多个补全。在这种情况下,我们有三个模型创建的补全,并请人们对这些补全进行排名。如果您仔细观察一段时间,顺便说一句,这些比较是非常困难的事情,比较某些预测可能会花费人们数小时,甚至对于一个单独的提示完成对。
Transformer模型将为该提示的完成情况预测一些奖励,基本上对每个完成情况的质量进行猜测。一旦它对每个完成情况都进行了猜测,我们也有来自承包商的排名信息作为基准。我们实际上可以强制执行某些数值应该比其他数值高得多等约束。
我们将此转化为损失函数,并训练我们的模型以进行与所有这些承包商的比较得到的基准一致的奖励预测。这就是我们训练奖励模型的方法。这样,我们就可以评分完成情况对于一个提示的好坏。
一旦我们有了奖励模型,我们不能单独部署它,因为它本身作为助手并不是非常有用,但是在接下来的强化学习阶段中非常有用。
因为我们有了奖励模型,我们可以评分任意给定提示的任意完成情况的质量。在强化学习阶段,我们基本上获取了大量的提示,并使用奖励模型进行强化学习。以下是其工作原理。
我们采用单个提示,将其按行排列,现在我们使用的基本上是我们希望训练的模型,该模型是在SFT模型初始化的基础上创建一些黄色的完成情况,并再次添加奖励令牌,并根据奖励模型读取奖励,奖励模型现在保持固定,不再改变。
现在,奖励模型告诉我们每个完成情况对于所有这些提示的质量,因此我们现在可以基本上应用相同的语言建模损失函数,但我们当前正在训练的是黄色的令牌,并且我们通过奖励模型指示的奖励来加权语言建模目标。
例如,在第一行中,奖励模型表示这是一个得分相当高的完成情况,因此我们在第一行上抽样的所有令牌都将得到强化,并且它们将在未来获得更高的概率。相反,在第二行中,奖励模型并不喜欢这个完成情况,-1.2。
因此,在第二行中抽样的每个令牌都将在未来获得稍高的概率。我们在许多提示的许多批次上反复执行此操作,基本上,我们得到一个根据我们在先前阶段训练的奖励模型得出高分的完成情况的策略。
这就是RLHF流程。然后,在最后,您将获得一个可以部署的模型。例如,ChatGPT是一个RLHF模型,但您可能遇到的其他模型,例如Vicuna-13B等,这些都是SFT模型。
到这一阶段,我们有基础模型、SFT模型和RLHF模型。这就是当前的情况。
那么为什么要使用RLHF呢?一个并不令人激动的答案是,它的效果更好。根据之前的研究,这些PPO模型是RLHF模型。当我们将它们提供给人类进行比较时,人们通常更喜欢来自RLHF模型的token,而不是来自SFT模型或被提示成助手的基础模型。它的效果更好。但是你可能会问为什么它的效果更好?我认为目前学术界还没有一个一致的令人惊讶的答案,但我可以提供一个可能的原因。
这与比较和生成之间的计算难度不对称有关。让我们以生成一个俳句为例,假设我要求模型写一个关于回形针的俳句。如果你是一个承包商,试图收集用于SFT阶段的数据,那么你如何为回形针创建一个好的俳句呢?你可能并不擅长这个,但如果我给你一些俳句的例子,你可能能够更好地欣赏其中的一些俳句而不是其他俳句。
判断哪个是好的是一个更容易的任务。基本上,这种不对称性使得比较成为一种更好的方式,可以更好地利用人类的判断来创建一个稍微更好的模型。然而,RLHF模型在某些情况下并不是对基础模型的改进。
特别是,我们注意到它们失去了一些熵。这意味着它们会产生更集中的结果。它们可以输出具有较低变异性的样本,而基础模型具有较高的熵,并会产生多样化的输出。例如,我仍然更喜欢在需要生成更多类似输出的情况下使用基础模型。
这是一个我刚刚准备的例子。我想生成一些酷炫的宝可梦名字。我给了它七个宝可梦的名字,然后让基础模型完成文本,它给了我更多的宝可梦名字。这些都是虚构的。我试图查找它们,但我不认为它们是真正的宝可梦。这是我认为基础模型擅长的任务,因为它仍然具有很高的熵。
它会给你很多不同的酷炫的东西,看起来与之前给它的东西相似。话虽如此,这些助手模型可能是您目前可用的模型。伯克利的一个团队对许多可用的助手模型进行了排名,并给出了它们的Elo评级。
目前,最好的模型当然是GPT-4,我会说是远远超过其他模型的,其次是Claude、GPT-3.5,然后还有一些模型,其中一些可能是可用的权重,如Vicuna、Koala等。这里的前三行都是RLHF模型,据我所知,其他所有模型都是SFT模型,我相信是这样的。
这就是我们在高层次上对这些模型进行训练的方式。
Part II: How to Prompt your (Chat)GPT Assistant
现在我将思路转向应用,让我们看看如何将GPT助手模型最好地应用于您的任务。现在,我想通过具体的例子中来解释如何工作。让我们用一个具体的例子来说明。假设您正在撰写一篇文章或博客文章,并且您将在最后写下这句话。
"加利福尼亚的人口是阿拉斯加人口的53倍。"因此,出于某种原因,您想要比较这两个州的人口。想一想丰富的内心独白、工具使用以及在生成这一个最终句子时您的大脑中实际进行的计算工作量。以下是您大脑中可能出现的情况。
对于下一步,让我在我的博客上写下来,让我比较这两个州的人口。首先,我显然需要获取这两个州的人口。现在,我知道我可能不会脱口而出地知道这些人口,所以我意识到我对自己的知识了解或不了解。
我继续使用工具,打开维基百科并查找加利福尼亚的人口和阿拉斯加的人口。现在,我知道我应该将这两个数字相除,但我知道,将39.2除以0.74几乎不可能在我的脑海中成功完成。这不是我能够在脑海中做的事情,因此,我将依靠计算器,使用计算器输入这些数字,结果大约是53。
然后,我可能会在脑海中进行一些反思和合理性检查。53是否合理?嗯,这是一个相当大的比例,但加利福尼亚是人口最多的州,所以可能看起来还可以。现在,我拥有了可能需要的所有信息,现在进入了写作的创造性阶段。我可能会开始写一些类似于"加利福尼亚的人口是53倍"的话,然后我自己想,这实际上是非常尴尬的措辞,所以让我删除它,再试一次。
在我写作的过程中,我有这个单独的过程,几乎在检查我所写的内容,并判断它是否看起来不错,然后我可能会删除,或者重新表达,然后也许我会对输出感到满意。简而言之,像这样创建句子时,在你的内心对话中发生了很多事情。
但是,当我们在训练GPT时,这样的句子是什么样子的呢?从GPT的角度来看,这只是一个token序列。GPT在阅读或生成这些token时,只是逐个进行处理,每个token的计算工作量大致相同。
这些Transformer网络不是非常浅的网络,它们大约有80层的推理过程,但是80层也不算太多。这个Transformer会尽力模仿,但当然,这里的过程与您采取的过程非常不同。特别是在我们最终创建的数据集和最终馈送到LLMs的数据集中,所有这些内部对话都被完全剥离,而与您不同的是,GPT将查看每个token,并在每个token上花费相同的计算资源。
因此,您不能指望它在每个token上做太多的工作,特别是这些Transformer只是token模拟器,它们不知道自己不知道的东西。它们只是尽力模仿下一个token。它们不知道自己擅长什么或不擅长什么。它们只是尽力模仿下一个token。
它们不会进行反思。它们不会对任何内容进行合理性检查。它们不会在途中纠正错误。默认情况下,它们只是样本token序列。它们的头脑中没有单独的内心对话流,对发生的情况进行评估。现在,它们确实具有一些认知优势,我认为这是因为它们实际上具有广泛的基于事实的知识,涵盖了大量领域,因为它们拥有数百亿个参数。
对于大量的事实来说,这是非常大的存储空间。我认为它们也具有相对较大且完美的工作内存(work memory)。无论什么信息,只要适应于上下文窗口,都可以通过其内部的自注意机制立即提供给Transformer,并且是完美的记忆,但它的大小是有限的,但Transformer可以直接访问它,因此它可以无损地记住其上下文窗口内的任何内容。
这是我将这两者进行比较的方式,我之所以提出所有这些观点,是因为我认为,在很大程度上,提示只是弥补这两种架构之间的认知差异,就像我们的大脑和LLM大脑之间的差异一样。您可以将其看作是这样的。例如,人们发现在实践中有一种方法效果相当不错。
特别是如果您的任务需要推理,您不能指望Transformer在每个token上进行太多的推理。您必须将推理分散到更多的token上。例如,您不能给Transformer一个非常复杂的问题,并期望它在一个token中得到答案。
有时我喜欢说,“这些Transformer需要更多token来思考。”这是一些效果良好的方法,例如,您可以使用几个示例提示,向Transformer展示在回答问题时应该展示自己的工作过程,如果您提供几个示例,Transformer将模仿该模板,并且从评估的角度来看,它的表现将更好。
此外,您可以通过逐步进行操作来引导Transformer表现出这种行为。因为这会使Transformer显示其工作过程,并且由于进入显示工作过程的模式,每个token的计算工作量会减少。结果更有可能成功,因为它会逐步进行推理。
这里是另一个例子,称为自一致性。我们看到,我们有能力开始写作,如果不成功,我可以再试一次,可以尝试多次,然后选择最好的那个。在这些方法中,您可以进行多次采样,然后进行某些处理,找出好的样本,只保留那些样本,或者进行多数投票等等。
基本上,这些Transformer在预测下一个令牌时,就像您一样,它们可能运气不佳,可能会采样到一个不太好的令牌,可能会在推理方面陷入死胡同。与您不同,它们无法从中恢复。无论它们知道这个序列行不通,它们都会继续生成序列。
给它们能力,让它们回顾、检查或尝试绕过这个问题的采样。
这里还有一种技术,事实证明,实际上LLM知道它们搞砸了。例如,假设您要求模型生成一首不押韵的诗,它可能会给您一首押韵的诗。但事实证明,特别是对于像GPT-4这样的大型模型,您可以问它“您是否完成了任务?”实际上,GPT-4非常清楚它没有完成任务。它只是在采样时不够幸运。它会告诉您:“不,实际上我没有完成任务,让我再试一次。”
但如果您没有提示它,它就不知道要重新访问等等。您必须在提示中弥补这一点,并让它进行检查。如果您不要求它进行检查,它就不会自行检查,它只是一个token模拟器。我认为更一般地说,许多这些技术都属于我所说的重新创造我们的系统2的范畴。
您可能对人类的系统1和系统2思维方式比较熟悉。系统1是一种快速自动的过程,我认为对应于LLM仅仅是采样token的过程。系统2是您大脑中较慢且有意识的规划部分。这实际上是一篇来自上周的论文,因为这个领域发展得非常快,它被称为“思维树”。
这篇论文的作者提出了为任何给定提示保持多个完成状态,然后在过程中对它们进行评分,并保留那些表现良好的状态。很多人都在尝试玩提示工程,以在LLM中重新引入我们大脑的一些能力。
现在,我想指出的一件事是,这不仅仅是一个提示。实际上,这是与一些Python粘合代码一起使用的提示,因为您实际上必须维护多个提示,并在此处进行一些树搜索算法来确定要扩展哪些提示等。它是Python粘合代码和单独的提示的共生,这些提示在while循环或更大的算法中被调用。
我还认为这与AlphaGo有一个非常酷的类比。AlphaGo在下围棋时有一个放置下一子的策略,这个策略最初是通过模仿人类进行训练的。但除了这个策略之外,它还进行了蒙特卡洛树搜索。基本上,它会在头脑中模拟一些可能性,并评估所有可能性,只保留效果良好的那些。
我认为这相当于AlphaGo,但是用于文本。就像思维树一样,我认为人们开始探索更一般的技术,不仅仅是简单的问答提示,而是将许多提示串联在一起,看起来更像是Python粘合代码。
在右侧,我有一篇名为React的论文的示例,他们将对提示的回答结构化为一系列思考-行动-观察,思考-行动-观察,这是一个完整的展开和思考过程来回答查询。在这些行动中,模型也被允许使用工具。在左侧,我有一个AutoGPT的示例。
顺便说一句,AutoGPT是一个我认为最近引起了很多关注炒作的项目,但我仍然觉得它非常有启发性和有趣。这个项目允许LLM保持任务列表并继续递归地分解任务。我认为目前这个功能并不是很好,我不建议人们在实际应用中使用它。
我只是认为它是一个可以从中获得启发的东西,随着时间的推移,我们可以给我们的模型带来系统2的思考能力。下一件我觉得有趣的事情是,LLM几乎有一个心理怪癖,他们不想要成功,他们想要模仿。
您想要成功,并且应该要求成功。我的意思是,当transformers进行训练时,它们有训练数据集,训练数据集中的性能质量可以有整个范围。例如,可能会有一些物理问题的提示,但是学生的解答可能完全错误,也可能有一个专家的回答是非常正确的。
transformers无法区分低质量解答和高质量解答的区别,因为它们只是在语言建模上进行训练。在测试时,您实际上必须要求一个良好的性能。在这篇论文的示例中,他们尝试了各种提示。
"让我们逐步思考"非常强大,因为它将推理分散到许多标记中。但更好的方法是,“让我们以逐步方式解决问题,确保我们得到正确答案”。这就像是将获得正确答案作为条件,实际上这使得transformer工作完成得更好,因为transformer现在不必将其概率质量投放在低质量解答上,尽管听起来有些荒谬。
基本上,您可以自由地要求一个强有力的解决方案。比如说,提示模型假设您是这个主题的领先专家,假设你有120的智商等等。但不要试图要求太高的智商,因为如果你要求400的智商,你可能会超出数据分布,或者更糟糕的是,你可能会进入某些类似科幻或角色扮演的数据分布。您必须找到合适的智商水平。我认为这有一定的U型曲线。
接下来,正如我们在解决问题时所看到的,我们知道我们擅长什么,不擅长什么,并在计算上依赖工具。您可能希望对您的LLM也是如此。特别是,我们可能希望给它们计算器、代码解释器等工具,以及进行搜索的能力,有许多技术可以实现这一点。
再次要记住的一点是,这些transformer默认情况下可能不知道自己不知道的东西。您甚至可能想在提示中告诉变压器,您不擅长心算。每当您需要进行大数相加、相乘或其他计算时,请使用这个计算器。这是如何使用计算器的方法,您需要明确说明,因为模型默认情况下可能不知道自己擅长或不擅长什么,就像您和我可能一样。
接下来,我认为非常有趣的是,我们从仅基于记忆的LLM,转变到一个完全基于检索的极端世界。
但实际上,在这两者之间有一个完整的空间,这在实践中非常有效。正如我之前提到的,变压器的上下文窗口就是它的工作记忆。如果您可以将与任务相关的任何信息加载到工作记忆中,模型将表现出极高的效果,因为它可以立即访问所有这些记忆。
我认为很多人对检索增强型模型非常感兴趣。在下方,我有一个名为LlamaIndex的示例,它是一个连接到各种不同类型数据的数据连接器。您可以对所有这些数据进行索引,并让LLM能够访问它们。这里的新方法是,您将相关文档拆分成块,对它们进行嵌入,并获得表示该数据的嵌入向量。
您将其存储在向量存储中,然后在测试时,对向量存储进行某种查询,获取可能与您的任务相关的块,并将它们放入提示中,然后进行生成。这在实践中可能非常有效。我认为这与你我解决问题时的方式相似。
您可以完全依靠记忆进行操作,而transformer具有非常大且广泛的记忆,但是参考一些主要文档确实非常有帮助。每当您发现自己需要查找教科书中的内容,或者每当您发现自己需要查找库的文档来查找某些内容时,transformer肯定也想这样做。您对某些库的文档工作方式有一些记忆,但查找更好。在这里也是一样。
接下来,我想简要谈谈约束提示。我也觉得这非常有趣。这基本上是强制要求LLM输出遵循某种模板的技术。
"Guidance"是微软的一个例子。在这里,我们强制要求LLM的输出为JSON格式。这实际上会保证输出采用这种形式,因为他们会干预transformer生成的所有不同token的概率,并将这些token约束在一定范围内,然后transformer只需填充空白处,您还可以对可能填入这些空白处的内容强制施加其他限制。
这可能非常有帮助,我认为微调(fine-tuning)也非常有趣。微调模型意味着您实际上要更改模型的权重。
在实践中,这变得更加可行,这是由于最近开发的一些技术和相应的库。例如,像LoRA这样的参数高效微调技术确保您仅训练模型的小而稀疏的部分。
因此,大部分模型保持在基础模型中,只有一些部分允许发生变化。实证上,这种方法仍然效果不错,并且仅对模型的小部分进行微调成本较低。另外,由于大部分模型是固定的,您可以对计算这些部分使用非常低的精度推理,因为这些部分不会通过梯度下降进行更新,这样也使得计算效率更高。
此外,我们还有一些开源的高质量基础模型。目前,正如我之前提到的,LLaMa是一个不错的选择,虽然我相信目前它不是商业许可的。需要记住的一些事情是,微调涉及的技术要求更多,需要更多的技术专长才能正确地进行。
它需要人工数据承包商来处理数据集和/或复杂的合成数据流程。这肯定会大大减慢您的迭代周期。在高层次上,SFT是可行的,因为您在继续进行语言建模任务。这相对比较直接。但是,我认为RLHF则属于研究领域,而且更难使其正常工作,所以我可能不会建议某人尝试自己实现RLHF。
这些方法相当不稳定,训练非常困难,目前对初学者来说可能不太友好,而且可能仍然在快速变化中。因此,我目前的默认建议是将您的任务分为两个主要部分。第一,实现最佳性能;第二,按顺序优化性能。
第一部分,目前最佳性能将来自GPT-4模型,它是迄今为止最强大的模型。使用非常详细的提示,包含大量任务内容、相关信息和指令。思考一下,如果您无法通过电子邮件与任务承包商进行交流,您会如何告诉他们。但同时也要记住,任务承包商是人类,他们有内心独白,非常聪明等等。
LLMs并没有这些品质。因此,请确保从几乎理解LLM的心理出发,并根据其特点来制定提示。在这些提示中检索并添加任何相关的上下文和信息。基本上,参考一些提示工程技术。我在上面的幻灯片中强调了其中一些技术,但这是一个非常广阔的领域,我建议您在网上寻找提示工程技术。
尝试一些少样本示例。这意味着您不仅仅要告诉,而且要展示,只要可能,给它一些示例,帮助它真正理解您的意思。尝试使用工具和插件来卸载LLMs无法处理的困难任务,然后不要仅仅考虑单个提示和回答,还要考虑潜在的链式反射,以及如何将它们粘合在一起,以及如何可能制作多个样本等。
最后,如果您认为您已经充分利用了提示工程,我建议您在一段时间内继续使用,那么可以考虑微调模型以适应您的应用程序,但请预计这将会是一个更加缓慢的过程,需要进入到专业而脆弱的研究领域,我指的是RLHF,目前如果能让它正常工作,它比SFT效果要好一些。
但是再说一次,这是相当复杂的,我会这样说。为了优化成本,尝试探索较低容量的模型或较短的提示等。我还想对我认为LLMs当前适用于的一些用例说几句话。特别要注意的是,目前LLMs存在许多限制,所以我会对您的所有应用程序都牢记这一点。
模型,顺便说一下,这可能需要一个完整的讲座来详细介绍。模型可能存在偏见,可能会捏造、产生幻觉信息,可能存在推理错误,可能在整个应用类别中遇到困难,它们具有知识截断,所以它们可能不知道2021年9月之后的任何信息。
它们容易受到各种攻击,这些攻击每天都在推特上出现,包括提示注入、越狱攻击、数据污染攻击等等。
因此,我目前的建议是在低风险应用中使用LLMs。始终结合人工监督使用它们。将它们用作灵感和建议的来源,并将其视为共同驾驶员,而不是完全自治的代理人只是在某个地方执行任务。
目前尚不清楚模型是否具备这种能力。所以我想在结束时说,GPT-4是一件令人惊叹的艺术品。我非常感激它的存在,它非常出色。它在许多领域拥有大量知识。它可以做数学、编码等等。此外,还有这个蓬勃发展的生态系统,将所有其他构建和整合到生态系统中。
我谈到的其中一些东西,以及所有这些功能都可以轻松获取。因此,以下是有关使用代码向GPT-4提问、提示并获取响应的所有必要信息。在这种情况下,我输入了以下内容,"can you say something to inspire the audience of Microsoft Build 2023?",然后我将其输入Python,GPT-4按原样回答如下:顺便说一下,我不知道他们在主题演讲中使用了这个技巧。
所以我以为我很聪明,但GPT-4真的更擅长这个。它说,女士们先生们,创新者和开拓者们,欢迎来到Microsoft Build 2023的盛会。你们是未来的建筑师,是塑造人类繁荣的数字领域的远见者。拥抱技术的无限可能性,让你的想法像你的想象力一样飞翔。让我们共同为子孙后代创造一个更加连接、卓越和包容的世界。准备好释放你的创造力,勾勒未知,将梦想变为现实。你的旅程从今天开始!
参考
-Andrej Karpathy:State of GPT
END
扫码加群,
立变AI🍚!
AI范儿读者群
那些prompt了我的,
是否也prompt了你...